package com.company

import java.lang.Exception
import java.lang.IllegalArgumentException

fun main() {

    //1、null    编译期提示

    //2、可空性    为了NullPointException  kotlin中除非另有规定变量不可为null值
    val str = "hello world"
//    str = null
    println(str)

    // 但null在kotlin中依然存在
    var info: String? = "JACK"
    info = null
    println(info)


    //3、null安全
    var result: String? = "butterfly"
    result = null
    println(result?.capitalize()) // 如果遇到null值就跳过函数调用

    //4、let函数
    var str2: String? = "butterfly"
//    str2 = ""
    str2 = str2?.let {
        if (it.isNotBlank()) {
            it.capitalize()
        } else {
            "butterfly"
        }
    }
    println(str2)

    //5、使用非空断言操作符  !!.  当变量为null会抛出KotlinNullPointException
    var str3: String? = "butterfly"
//    str3 = null
    println(str3!!.capitalize())


    //6、使用空合并操作符 ?:   如果左边值为null 使用右边的结果
    var str4: String? = "butterfly"

    str4 = null
    val result2: String = str4 ?: "rose"
    println(result2)


    //和let函数一起使用
    str4 = str4?.let { it.capitalize() } ?: "jack"
    println(str4)


    //7、异常处理
    var number: Int? = null
    try {
        checkOperation(number)
    } catch (e: Exception) {
        println(e)
    }

}

fun checkOperation(number: Int?) {
//    number ?: throw UnskilledException()

    // 也可以使用一些先决条件函数
    checkNotNull(number, { "something is not good." })
}

class UnskilledException : IllegalArgumentException("操作不当")
